package org.zebra.mybatis.plus.ext.redundancy.util;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.util.StringUtils;
import org.zebra.mybatis.plus.ext.AnnotatedElementPlusUtil;

import java.lang.reflect.Field;

/**
 * @author zhanghongbin
 */
public class TableColumnNameUtil {

    public static String filterSpecialChar(String name) {
        return name.replaceAll("`", "");
    }

    /**
     * 根据注解顺序和配置，获取字段对应的数据库字段名
     *
     * @param field 字段
     * @param mapUnderscoreToCamelCase 是否开启自动驼峰命名规则（camel case）映射，
     *                                 即从经典数据库列名 A_COLUMN（下划线命名） 到经典 Java 属性名 aColumn（驼峰命名） 的类似映射。
     *                                 默认为true
     * @return true , false
     */
    public static String getRealColumnName(Field field, boolean mapUnderscoreToCamelCase) {
        TableField tableField = AnnotatedElementPlusUtil.findDeepMergedAnnotation(field, TableField.class);
        if (tableField != null && StringUtils.hasText(tableField.value()) && tableField.exist()) {
            return filterSpecialChar(tableField.value());
        }
        TableId tableId = AnnotatedElementUtils.findMergedAnnotation(field, TableId.class);
        if (tableId != null && StringUtils.hasText(tableId.value())) {
            return filterSpecialChar(tableId.value());
        }

        return smartConvert(mapUnderscoreToCamelCase, field.getName());
    }

    public static String smartConvert(boolean underCamel, String column) {

        // 开启字段下划线申明
        if (underCamel) {
            column = com.baomidou.mybatisplus.core.toolkit.StringUtils.camelToUnderline(column);
        }
        // 全局大写命名
        //        if (MybatisPlusProperties.capitalMode) {
        //            column = column.toUpperCase();
        //        }
        return column;
    }
}
